package org.example.CAS;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicStampedReference;

public class CASdemo {
    public static void main(String[] args) {
        AtomicStampedReference<Integer> asr = new AtomicStampedReference<>(1,1);

        new Thread(()->{
            // 先获取当前的版本号
            System.out.println("a最初的版本号是（1）：----"+asr.getStamp());
            // 时停
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 然后我要交换
            System.out.println(asr.compareAndSet(1, // 期望之前的值是
                    2,  // 要修的成的值
                    asr.getStamp(),   // 获取我希望的版本号
                    asr.getStamp() + 1));
            System.out.println("第一次a线程改完之后的版本号（2）---"+asr.getStamp());

            // 然后我要交换
            System.out.println(asr.compareAndSet(2, // 期望之前的值是
                    1,  // 要修的成的值
                    asr.getStamp(),   // 获取我希望的版本号
                    asr.getStamp() + 1));
            System.out.println("第二次a线程改完之后的版本号（3）"+asr.getStamp());
        },"a").start();

        // 线程b再改
        new Thread(()->{
            System.out.println("b线程要操作物品了，先看看版本号是不是1，其实应该是3---"+asr.getStamp());
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(asr.compareAndSet(1,
                    6,
                    asr.getStamp(),
                    asr.getStamp() + 1));
            System.out.println("预期是4---"+asr.getStamp());
        },"b").start();

    }
}
